/*
package中
"type": "module", // ts-node-esm xxx.xx

在执行时是
ts-node-esm xxxxx.ts

参考地址：
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set/Set
*/
// Set
// 集合是由一组无序且唯一(即不能重复)的项组成的，可以想象成集合是一个既没有重复元素，也没有顺序概念的数组
/* let set:Set<number> = new Set([1,2,3,4,5,6,6,6,6,6,6,6])  // 天然去重 引用类型除外

set.add(7)
set.delete(7)
set.clear()

set.forEach((value, key, set) => {
    console.log(value, key, set)
})
const iteratorSet = set.entries()
for (const [key, value] of iteratorSet) {
  console.log(`${key}: ${value}`);
}

console.log(set)
console.log(set.has(7)) */
// Map
// 它类似于对象，也是键值对的集合，但是“键”的范围不限于字符串，各种类型的值（包括对象）都可以当作键，是一种更完善的 Hash 结构实现。
// 这也是它与Set最大区别，因为Set的“键”只能是字符串。
// 如果你需要“键值对”的数据结构，Map 比 Object 更合适
/* let obj = {name: "小满"}
let map:Map<object, any> = new Map()

map.set(obj, "小满") */
// weakMap weakSet   弱项  弱引用 不会被计入垃圾回收策略
// weakMap map 区别  weakMap 的key 只能是引用类型
let objWeakMap = { name: "孙亚龙" }; // obj引用次数1
let aadsak = objWeakMap; // obj引用次数2
let weakmap = new WeakMap();
weakmap.set(objWeakMap, "dsfds1231dsadsa"); // obj引用次数1 并未被计入垃圾回收策略 只有当前一次引用都被回收，才会被计入垃圾回收策略
objWeakMap = null;
// aadsak = null
// v8 GC 不稳定 最少200ms
// 由于weakmap的key只能是引用类型,并且当key引用被回收，就被计入垃圾回收策略，所以不能进行循环迭代
setTimeout(() => {
    console.log(aadsak);
    console.log(weakmap.get(objWeakMap));
}, 500);
// weakSet Set 区别  weakSet 的key 只能是引用类型
let objWeakSet = new WeakSet([obj]);
